上個章節介紹完前置設定跟資料備份,這張我們來講replay memory跟探索值epsilon!
if observe : # 是否進入觀察狀態,如果有那接下來模型都不會訓練,觀察已滿意的模型用
OBSERVE = 999999999 #
epsilon = FINAL_EPSILON
print ("Now we load weight")
model.load_weights("model.h5")
adam = Adam(lr=LEARNING_RATE)
model.compile(loss='mse',optimizer=adam)
else: #We go to training mode
OBSERVE = OBSERVATION
epsilon = load_obj("epsilon")
model.load_weights("model.h5")
adam = Adam(lr=LEARNING_RATE)
model.compile(loss='mse',optimizer=adam)
t = load_obj("time") # 載入已訓練的回合次數,銜接過去強制結束前的訓練紀錄。
宣告區域變數
while (True):
loss = 0 # loss值
Q_sa = 0 # 後面要用的Q現實
action_index = 0 # 執行的動作
r_t = 0 # 獎勵值
a_t = np.zeros([ACTIONS]) # 動作的array
這邊FRAME_PER_ACTION值設1,無論如何都會執行除非你希望1禎以上做判斷。第二層判斷為是否隨機探索。
if t % FRAME_PER_ACTION == 0:
if random.random() <= epsilon: #探索值
print("----------Random Action----------")
action_index = random.randrange(ACTIONS)
a_t[action_index] = 1
else: # 模型output
q = model.predict(s_t)
max_Q = np.argmax(q) # 兩個動作選最大的值並取出index
action_index = max_Q
a_t[action_index] = 1
讓epsilon不斷遞減直到final_epsilon。
if epsilon > FINAL_EPSILON and t > OBSERVE:
epsilon -= (INITIAL_EPSILON - FINAL_EPSILON) / EXPLORE
x_t1, r_t, terminal = game_state.get_state(a_t) # 輸入動作給環境
print('fps: {0}'.format(1 / (time.time()-last_time))) # 計算時間點
last_time = time.time() # 重置時間點
x_t1 = x_t1.reshape(1, x_t1.shape[0], x_t1.shape[1], 1) # 1x80x80x1
s_t1 = np.append(x_t1, s_t[:, :, :, :3], axis=3) # 新的圖像更新至最前面,原本第四個捨棄
這邊就是控制replay memory的數量,有超過就移除最左邊的資料。
D.append((s_t, action_index, r_t, s_t1, terminal))
if len(D) > REPLAY_MEMORY:
D.popleft()
訓練小恐龍主程序unit5_dino
好哩環境跟資料倉儲差不多了,明天開始分享核心DQN訓練囉!